import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import './router/guard' // 启用路由守卫
import ElementPlus, { ElMessage } from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import axios from 'axios'

const app = createApp(App)

// 注册所有Element Plus图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}

// 创建axios实例
const axiosInstance = axios.create({
    baseURL: import.meta.env.DEV ? '/housingHub' : 'http://localhost:8085/housingHub',
    timeout: 10000
})

// 请求拦截器
axiosInstance.interceptors.request.use(
    config => {
        // 添加token到请求头，优先使用userToken，其次使用adminToken
        const userToken = localStorage.getItem('userToken')
        const adminToken = localStorage.getItem('adminToken')
        const token = userToken || adminToken

        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }
        return config
    },
    error => {
        return Promise.reject(error)
    }
)

// 响应拦截器
axiosInstance.interceptors.response.use(
    response => {
        return response.data
    },
    error => {
        // 处理响应错误
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    // 处理未授权情况，根据当前路径智能清除对应的token
                    if (window.location.pathname.includes('/admin')) {
                        // 管理员相关请求失败，只清除管理员登录信息
                        localStorage.removeItem('adminToken')
                        localStorage.removeItem('adminInfo')
                        localStorage.removeItem('isAdminLoggedIn')
                        router.push('/admin-login')
                        ElMessage.error('管理员登录已过期，请重新登录')
                    } else {
                        // 用户相关请求失败，只清除用户登录信息
                        localStorage.removeItem('userToken')
                        localStorage.removeItem('userInfo')
                        localStorage.removeItem('isLoggedIn')
                        router.push('/login')
                        ElMessage.error('用户登录已过期，请重新登录')
                    }
                    break
                case 500:
                    ElMessage.error('服务器内部错误')
                    break
                case 400:
                    // 400错误让具体的组件处理，不在这里统一处理
                    break
                default:
                    ElMessage.error(error.response.data.message || '请求失败')
            }
        }
        return Promise.reject(error)
    }
)

// 挂载到全局属性
app.config.globalProperties.$axios = axiosInstance

app.use(router)
app.use(ElementPlus)
app.mount('#app')

// 导出axios实例，方便组件中使用inject/provide或直接导入使用
export default axiosInstance
